package com.lagou.handler;

import com.lagou.protocol.RpcRequest;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

import java.lang.reflect.Method;

/**
 * @author 13771
 * @date 2020/8/31 10:57
 * @description  自定义业务处理器
 */
public class UserServiceHandler extends ChannelInboundHandlerAdapter{

    //当客户端读取数据时，该方法会被调用
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        //注意：客户端将来发送请求的时候会传递一个参数： UserService#sayHello#are you ok
        //1.判断当前的请求是否符合规则
//        if (msg.toString().startsWith("UserService")){
//            //2.如果符合规则，调用实现类获取到一个result
//            UserServiceImpl service = new UserServiceImpl();
//            String result = service.sayHello(msg.toString().substring(msg.toString().lastIndexOf("#")+1));
//
//            //3.把result写到客户端
//            ctx.writeAndFlush(result);
//        }

        if(msg instanceof RpcRequest){
            RpcRequest rpcRequest = (RpcRequest) msg;
            //得到类名
            String className = rpcRequest.getClassName();
            Class<?> userClass = Class.forName(className);
            //从map中得到Bean对象
            Object serviceBean = RpcServerApplicationContextAware.serviceMap.get(className);
            //得到方法名
            String methodName = rpcRequest.getMethodName();
            //得到参数
            Object[] parameters = rpcRequest.getParameters();
            //得到参数类型
            Class<?>[] parameterTypes = rpcRequest.getParameterTypes();
            //根据方法名和参数类型得到Method对象
            Method method = userClass.getMethod(methodName, parameterTypes);
            String result = (String) method.invoke(serviceBean, parameters);

            ctx.writeAndFlush(result);
        }

    }
}
